package com.app.miwawa.cui.eam;

import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.framework.common.api.support.model.ProcessModel;
import org.framework.common.cui.AbstractController;
import org.framework.common.ext.util.DateUtil.DatePattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.app.miwawa.api.eam.entity.Classes;
import com.app.miwawa.api.eam.entity.ClassesRecord;
import com.app.miwawa.api.eam.entity.view.ClassesTeacher;
import com.app.miwawa.api.eam.entity.view.StudentLesson;
import com.app.miwawa.api.eam.service.bo.ClassesBo;
import com.app.miwawa.api.eam.service.bo.ClassesStudentBo;

/**
 * 用户界面请求控制器类
 * <p>描述: 班级</p>
 * <p>Company: Professional</p>
 * @author chanlong(陈龙)
 * @date 2016年2月3日 上午11:53:10
 * @version 1.0.2016
 */
@RestController
public class ClassesController extends AbstractController{
	
	@Autowired
	private JdbcTemplate jdbc;
	
	@Autowired
	private ClassesBo classesBo;
	
	@Autowired
	private ClassesStudentBo classesStudentBo;

	/**
	 * 保存,新增班级.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年2月8日 下午7:21:35
	 */
	@RequestMapping("/{dbname}/classes/save")
	public Object save(@PathVariable final String dbname, @ModelAttribute final Classes entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			// 设置编码
			entity.setCode(classesBo.maxcode());
			
			// 保存实体对象
			Classes classes = classesBo.insert(entity);
			
			// 保存关联对象
			classes = classesBo.insertRelation(classes);
			classes = classesBo.insertRelations(classes);
			
			// 返回实体对象
			return classes;
		} catch (Exception e) {
			return error("保存班级信息失败！", e);
		}
	}
	
	/**
	 * 更新班级信息.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年5月2日 下午8:02:12
	 */
	@RequestMapping("/{dbname}/classes/update")
	public Object update(@PathVariable final String dbname, @ModelAttribute final Classes entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			classesBo.update(entity);
			
			classesStudentBo.update(entity.getName(), entity.getId());
			
			// 返回实体对象
			return success("更新班级信息成功！");
		} catch (Exception e) {
			return error("更新班级信息失败！", e);
		}
	}
	
	/**
	 * 逻辑删除班级,同时逻辑删除该班下的所有学生和该班下教室信息和教师信息
	 * @param dbname
	 * @param id
	 * @return
	 * @throws Exception
	 * @author Administrator(陈龙)
	 * @date 2016年9月22日 上午10:05:16
	 */
	@RequestMapping("/{dbname}/classes/remove/{id}")
	public Object remove(@PathVariable final String dbname,@PathVariable final String id)throws Exception{
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			// 创建业务操作模型
			ProcessModel process = ProcessModel.factory();
			
			// 关闭班级,逻辑删除该班下的所有学生和该班下教室信息和教师信息
			process.jdbc.update(process.properties.getProperty("classes.close"),id);
			
			// 返回实体对象
			return success("删除班级成功！");
		} catch (Exception e) {
			return error("删除班级失败！", e);
		}
	}
	
	/**
	 * 还原班级
	 * @param dbname
	 * @param id
	 * @return
	 * @throws Exception
	 * @author Administrator(陈龙)
	 * @date 2016年9月22日 上午10:29:16
	 */
	@RequestMapping("/{dbname}/classes/reback/{id}")
	public Object reback(@PathVariable final String dbname,@PathVariable final String id)throws Exception{
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			// 创建业务操作模型
			ProcessModel process = ProcessModel.factory();
			
			// 还原班级
			process.jdbc.update(process.properties.getProperty("classes.reopen"),id);
			
			// 返回实体对象
			return success("还原班级成功！");
		} catch (Exception e) {
			return error("还原班级失败！", e);
		}
	}
	
	/**
	 * 删除教室信息，同时删除班级和教室关联关系/还原教室.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年5月12日 下午12:22:44
	 */
	@RequestMapping("/{dbname}/classes/room/{operation}/{roomid}")
	public Object operateRoom(@PathVariable final String dbname, @PathVariable final String operation, @PathVariable final String roomid) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			ProcessModel process = ProcessModel.factory();
			
			if("delete".equals(operation)){
				process.jdbc.update(process.properties.getProperty("classes.room.delete"), roomid);
			}else{
				process.jdbc.update(process.properties.getProperty("classes.room.reback"), roomid);
			}
			// 返回实体对象
			return success("操作成功！");
		} catch (Exception e) {
			e.printStackTrace();
			return error("操作失败！", e);
		}
	}
	
	/**
	 * 删除课程信息，同时删除班级和课程关联关系./还原课程
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年5月12日 下午12:22:44
	 */
	@RequestMapping("/{dbname}/classes/lesson/{operation}/{lessonid}")
	public Object operateLesson(@PathVariable final String dbname, @PathVariable final String operation, @PathVariable final String lessonid) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			ProcessModel process = ProcessModel.factory();
			
			if("delete".equals(operation)){
				process.jdbc.update(process.properties.getProperty("classes.lesson.delete"), lessonid);
			}else{
				process.jdbc.update(process.properties.getProperty("classes.lesson.reback"), lessonid);
			}

			// 返回实体对象
			return success("操作成功！");
		} catch (Exception e) {
			e.printStackTrace();
			return error("操作失败！", e);
		}
	}
	
	/**
	 * 删除老师和班级及课时费关系.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月27日 下午4:51:17
	 */
	@RequestMapping("/{dbname}/classes/relation/delete")
	public Object delete(@PathVariable final String dbname, @ModelAttribute final ClassesTeacher entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");
		
		try{
			// 注册数据源
			registerDataSource(dbname);
			
			classesBo.deleteRelation(entity);
			
			// 返回实体对象
			return success("删除班级关联信息成功！");
		} catch (Exception e) {
			return error("删除班级关联信息失败！", e);
		}
	}
	
	/**
	 * 班级管理中的，查看签到历史.
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年4月16日 下午4:56:16
	 */
	@RequestMapping("/{dbname}/classes/check/history")
	public Object history(@PathVariable final String dbname, @ModelAttribute final StudentLesson entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");

		try {
			// 注册数据源
			registerDataSource(dbname);

			String item = entity.getItem();
			String checkDate = DateFormatUtils.format(entity.getCheckDate(), DatePattern.DATE.value()) ;
			String classesId = entity.getClassesId();
			
			List<Map<String,Object>> result = jdbc.queryForList("call pro_saas_checkhistory(?,?,?)", item, checkDate, classesId);

			return result;
		} catch (Exception e) {
			e.printStackTrace();
			return error("查看签到历史失败！", e);
		}
	}
	
	/**
	 * 保存班级应到信息.
	 * PS:签到时保存
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年10月10日 下午5:27:04
	 */
	@RequestMapping("/{dbname}/classes/record/save")
	public Object record(@PathVariable final String dbname, @ModelAttribute final ClassesRecord entity) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");

		try {
			// 注册数据源
			registerDataSource(dbname);

			return entity.save();
		} catch (Exception e) {
			e.printStackTrace();
			return error("保存班级应到信息失败！", e);
		}
	}
	
	/**
	 * 更新班级应到信息.
	 * PS:签到时保存
	 * @param dbname
	 * @param entity
	 * @return
	 * @throws Exception
	 * @author chanlong(陈龙)
	 * @date 2016年10月10日 下午5:27:04
	 */
	@RequestMapping("/{dbname}/classes/record/update")
	public Object update(@PathVariable final String dbname, @RequestParam final Map<String, Object> params) throws Exception {
		// 参数检查
		if (check(dbname)) return error("请检查数据源或参数绑定源。");

		try {
			// 注册数据源
			registerDataSource(dbname);
			
			Object classesId = params.get("classesId");
			Object checkDate = params.get("checkDate");
			Object students = params.get("students");
			
			ProcessModel process = ProcessModel.factory();
			jdbc.update(process.properties.getProperty("classes.update.record"),students, classesId, checkDate);
 
			return success("更新班级应到信息成功！");
		} catch (Exception e) {
			e.printStackTrace();
			return error("更新班级应到信息失败！", e);
		}
	}
}
